.data:
a:
.word	0x1

.text:

// st: immediate (instr: 1-2)
// 10111001000000111
// 00011100111000101
mov		7, %l4
st		%l4, [%fp+9]	// [%fp+9] = 7	

// st: address (instr: 3-4)
// 10111000000001010
// 00011000000000000
mov		10, %l0
st		%l0, a			// a = 10

// ld: immediate (instr: 5)
// 00010000111000101
ld		[%fp+9], %l0	// %l0 = 7

// ld: address (instr: 6)
// 10111000010000000
ld		a, %l1			// %l1 = 10

///////////////////////////////////////////////////////////

// mov: immediate (instr: 7)
// 10111001000000111
mov		7, %l4			// %l4 = 7

// mov: register (instr: 8)
// 10111110001100000
mov		%l4, %l3		// %l3 = %l4 = 7 

// mov: immediate: data (instr: 9)
// 10111001001000001
mov		980000, %l4	// %l4 = ef420 

// mov: address: data (instr: 10)
// 10111011001000000
mov		a, %l4			// %l4 = 1

///////////////////////////////////////////////////////////

// add: register (instr: 11-13)
mov		3, %l0			// %l0 = 3
mov		5, %l1			// %l1 = 5
add		%l0, %l1, %l2	// %l2 = %l0 + %l1 = 8

// add: immediate (instr: 14)
add		%l0, 10, %l2	// %l2 = %l0 + 10 = 3 + 10 = 13 = d

// add: immediate: data (instr: 15)
add		%l0, 980000, %l2	// %l2 = %l0 + 980000 = 3 + 980000 = ef423

// subtract should work similarly like add 
// sub: register (instr: 16-18)
mov		3, %l0			// %l0 = 3
mov		5, %l1			// %l1 = 5
sub		%l1, %l0, %l2	// %l2 = %l1 - %l0 = 2

// sub: immediate (instr: 19)
sub		%l0, 10, %l2	// %l2 = %l0 - 10 = 3 - 10 = -7 = 3fffffff9

// sub: immediate: data (instr: 20)
sub		%l0, 980000, %l2	// %l2 = %l0 - 980000 = 3 - 980000 = 3fff10be3

// 979997 = 11101111010000011101
//-979997 = 00010000101111100011 two's complement 
  
///////////////////////////////////////////////////////////

// sll: immediate (instr: 21-22)
// 00110000000000011
mov		3, %l0			// %l0 = 3
sll		%l0, 3, %l0		// %l0 << 3 = 3 << 3 = 18

// sll: data (instr: 23-24)
mov		3, %l0			// %l0 = 3
sll		%l0, 1, %l0		// %l0 << 1 = 6

// srl should work similarly like sll
// srl: immediate (instr: 25-26)
mov		3, %l0			// %l0 = 3
srl		%l0, 1, %l0		// %l0 >> 1 = 3 >> 1 = 1

// srl: data (instr: 27-28)
mov		9, %l0			// %l0 = 9 
srl		%l0, 3, %l0		// %l0 >> 3 = 1

///////////////////////////////////////////////////////////

// swap (instr: 29-31)
mov		10, %l0
mov		6, %l1
swap	%l0, %l1, %l2	// %l2 = %l0 = 10; 
						// %l0 = %l1 = 6

///////////////////////////////////////////////////////////

// and: register (instr: 32-34)
// 01000	000	010	0	001	??
// 01000000010000100
mov		1, %l0
mov		0, %l1
and		%l0, %l1, %l2	// %l2 = %l0 && %l1 = 1 && 0 = 0

// and: immediate (instr: 35)
// 01000	000	010	1	0	0001
// 01000000010100001
and		%l0, 1, %l2		// %l2 = %l0 && 1 = 1 && 1 = 1 

// and: immediate: data (instr: 36)
// 01000	000	010	1	1	0110
// 01000000010110100
and		%l0, 980000, %l2	// %l2 = %l0 && 980000 = 0 

// 980000 = 11101111010000100000
// && 1   = 0

///////////////////////////////////////////////////////////

// or: register (instr: 37-39)
mov		1, %l0
mov		0, %l1
or		%l0, %l1, %l2	// %l2 = %l0 || %l1 = 1 || 0 = 1

// or: immediate (instr: 40)
or		%l1, 0, %l2		// %l2 = %l1 || 0 = 0 || 0 = 0

// or: immediate: data (instr: 41)
or		%l0, 980000, %l2	// %l2 = %l0 || 980000 = 980001 = ef421

// 980000 = 11101111010000100000
// || 1   = 11101111010000100001

///////////////////////////////////////////////////////////

// (0 NOR 0) = 1
// (0 NOR 1) = 0
// (1 NOR 0) = 0
// (1 NOR 1) = 0

// nor: register (instr: 42-44)
mov		1, %l0
mov		0, %l1
nor		%l0, %l1, %l2	// %l2 = %l0 nor %l1 = 1 nor 0 = 3fffffffe

// nor: immediate (instr: 45)
nor		%l1, 0, %l2		// %l2 = %l1 nor 0 = 0 nor 0 = 3ffffffff

// nor: immediate: data (instr: 46)
nor		%l1, 980000, %l2	// %l2 = %l1 nor 980000 = 3fff10bdf 

// 980000 = 11101111010000100000
// nor 0  = 00010000101111011111

///////////////////////////////////////////////////////////

// 0 xnor 0 = 1
// 0 xnor 1 = 0
// 1 xnor 0 = 0 
// 1 xnor 1 = 1

// xnor: register (instr: 47-49)
mov		1, %l0
mov		0, %l1
xnor	%l0, %l1, %l2	// %l2 = %l0 xnor %l1 = 1 xnor 0 = 3fffffffe

// xnor: immediate (instr: 50)
xnor	%l0, 1, %l2		// %l2 = %l0 xnor 1 = 1 xnor 1 = 3ffffffff

// xnor: immediate: data (instr: 51)
xnor	%l0, 980000, %l2	// %l2 = %l0 xnor 980000 = 3fff10bde

// 980000 = 11101111010000100000
// xnor 1 = 00010000101111011110

///////////////////////////////////////////////////////////

// (instrt: 52)
mov		3, %l0

// (instr: 53)
in		%l0, %l1

// (instr: 54)
out		%l0, %l1

///////////////////////////////////////////////////////////

hello: 

// (instr: 55) PC = 54
mov		2, %rv

// branch (instr: 56) PC = 55
ba		hello

// (instr: 57) SKIP!
mov		1, %rv

///////////////////////////////////////////////////////////

// (instr: 58)
//halt

// (instr: 59)
mov		1, %l1

